﻿/*
 * Inline Form Validation Engine 2.6.2, jQuery plugin
 *
 * Copyright(c) 2010, Cedric Dugas
 * http://www.position-absolute.com
 *
 * 2.0 Rewrite by Olivier Refalo
 * http://www.crionics.com
 *
 * Form validation engine allowing custom regex rules to be added.
 * Licensed under the MIT License
 */
!function(a) {
    "use strict";
    Array.indexOf || (Array.prototype.indexOf = function(a) {
        for (var b = 0; b < this.length; b++)
            if (this[b] == a)
                return b;
        return -1
    }
    );
    var b = {
        init: function(c) {
            var d = this;
            return d.data("jqv") && null  != d.data("jqv") || (c = b._saveOptions(d, c),
            a(document).on("click", ".formError", function() {
                a(this).fadeOut(150, function() {
                    a(this).parent(".formErrorOuter").remove(),
                    a(this).remove()
                })
            })),
            this
        },
        attach: function(c) {
            var e, d = this;
            return e = c ? b._saveOptions(d, c) : d.data("jqv"),
            e.validateAttribute = d.find("[data-validation-engine*=validate]").length ? "data-validation-engine" : "class",
            e.binded && (d.on(e.validationEventTrigger, "[" + e.validateAttribute + "*=validate]:not([type=checkbox]):not([type=radio]):not(.datepicker)", b._onFieldEvent),
            d.on("click", "[" + e.validateAttribute + "*=validate][type=checkbox],[" + e.validateAttribute + "*=validate][type=radio]", b._onFieldEvent),
            d.on(e.validationEventTrigger, "[" + e.validateAttribute + "*=validate][class*=datepicker]", {
                delay: 300
            }, b._onFieldEvent)),
            e.autoPositionUpdate && a(window).bind("resize", {
                noAnimation: !0,
                formElem: d
            }, b.updatePromptsPosition),
            d.on("click", "a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']", b._submitButtonClick),
            d.removeData("jqv_submitButton"),
            d.on("submit", b._onSubmitEvent),
            this
        },
        detach: function() {
            var c = this
              , d = c.data("jqv");
            return c.find("[" + d.validateAttribute + "*=validate]").not("[type=checkbox]").off(d.validationEventTrigger, b._onFieldEvent),
            c.find("[" + d.validateAttribute + "*=validate][type=checkbox],[class*=validate][type=radio]").off("click", b._onFieldEvent),
            c.off("submit", b._onSubmitEvent),
            c.removeData("jqv"),
            c.off("click", "a[data-validation-engine-skip], a[class*='validate-skip'], button[data-validation-engine-skip], button[class*='validate-skip'], input[data-validation-engine-skip], input[class*='validate-skip']", b._submitButtonClick),
            c.removeData("jqv_submitButton"),
            d.autoPositionUpdate && a(window).off("resize", b.updatePromptsPosition),
            this
        },
        validate: function() {
            var e, f, c = a(this), d = null ;
            if (c.is("form") || c.hasClass("validationEngineContainer")) {
                if (c.hasClass("validating"))
                    return !1;
                c.addClass("validating"),
                e = c.data("jqv"),
                d = b._validateFields(this),
                setTimeout(function() {
                    c.removeClass("validating")
                }, 100),
                d && e.onSuccess ? e.onSuccess() : !d && e.onFailure && e.onFailure()
            } else
                c.is("form") || c.hasClass("validationEngineContainer") ? c.removeClass("validating") : (f = c.closest("form, .validationEngineContainer"),
                e = f.data("jqv") ? f.data("jqv") : a.validationEngine.defaults,
                d = b._validateField(c, e),
                d && e.onFieldSuccess ? e.onFieldSuccess() : e.onFieldFailure && e.InvalidFields.length > 0 && e.onFieldFailure());
            return e.onValidationComplete ? !!e.onValidationComplete(f, d) : d
        },
        updatePromptsPosition: function(c) {
            var d, e, f;
            return c && this == window ? (d = c.data.formElem,
            e = c.data.noAnimation) : d = a(this.closest("form, .validationEngineContainer")),
            f = d.data("jqv"),
            d.find("[" + f.validateAttribute + "*=validate]").not(":disabled").each(function() {
                var g, h, c = a(this);
                f.prettySelect && c.is(":hidden") && (c = d.find("#" + f.usePrefix + c.attr("id") + f.useSuffix)),
                g = b._getPrompt(c),
                h = a(g).find(".formErrorContent").html(),
                g && b._updatePrompt(c, a(g), h, void 0, !1, f, e)
            }),
            this
        },
        showPrompt: function(a, c, d, e) {
            var f = this.closest("form, .validationEngineContainer")
              , g = f.data("jqv");
            return g || (g = b._saveOptions(this, g)),
            d && (g.promptPosition = d),
            g.showArrow = 1 == e,
            b._showPrompt(this, a, c, !1, g),
            this
        },
        hide: function() {
            var f, c = a(this).closest("form, .validationEngineContainer"), d = c.data("jqv"), e = d && d.fadeDuration ? d.fadeDuration : .3;
            return f = a(this).is("form") || a(this).hasClass("validationEngineContainer") ? "parentForm" + b._getClassName(a(this).attr("id")) : b._getClassName(a(this).attr("id")) + "formError",
            a("." + f).fadeTo(e, .3, function() {
                a(this).parent(".formErrorOuter").remove(),
                a(this).remove()
            }),
            this
        },
        hideAll: function() {
            var b = this
              , c = b.data("jqv")
              , d = c ? c.fadeDuration : 300;
            return a(".formError").fadeTo(d, 300, function() {
                a(this).parent(".formErrorOuter").remove(),
                a(this).remove()
            }),
            this
        },
        _onFieldEvent: function(c) {
            var d = a(this)
              , e = d.closest("form, .validationEngineContainer")
              , f = e.data("jqv");
            f.eventTrigger = "field",
            window.setTimeout(function() {
                b._validateField(d, f),
                0 == f.InvalidFields.length && f.onFieldSuccess ? f.onFieldSuccess() : f.InvalidFields.length > 0 && f.onFieldFailure && f.onFieldFailure()
            }, c.data ? c.data.delay : 0)
        },
        _onSubmitEvent: function() {
            var e, f, c = a(this), d = c.data("jqv");
            return c.data("jqv_submitButton") && (e = a("#" + c.data("jqv_submitButton")),
            e && e.length > 0 && (e.hasClass("validate-skip") || "true" == e.attr("data-validation-engine-skip"))) ? !0 : (d.eventTrigger = "submit",
            f = b._validateFields(c),
            f && d.ajaxFormValidation ? (b._validateFormWithAjax(c, d),
            !1) : d.onValidationComplete ? !!d.onValidationComplete(c, f) : f)
        },
        _checkAjaxStatus: function(b) {
            var c = !0;
            return a.each(b.ajaxValidCache, function(a, b) {
                return b ? void 0 : (c = !1,
                !1)
            }),
            c
        },
        _checkAjaxFieldStatus: function(a, b) {
            return 1 == b.ajaxValidCache[a]
        },
        _validateFields: function(c) {
            var f, g, h, i, j, k, l, m, n, d = c.data("jqv"), e = !1;
            if (c.trigger("jqv.form.validating"),
            f = null ,
            c.find("[" + d.validateAttribute + "*=validate]").not(":disabled").each(function() {
                var g = a(this)
                  , h = [];
                if (a.inArray(g.attr("name"), h) < 0) {
                    if (e |= b._validateField(g, d),
                    e && null  == f && (g.is(":hidden") && d.prettySelect ? f = g = c.find("#" + d.usePrefix + b._jqSelector(g.attr("id")) + d.useSuffix) : (g.data("jqv-prompt-at") instanceof jQuery ? g = g.data("jqv-prompt-at") : g.data("jqv-prompt-at") && (g = a(g.data("jqv-prompt-at"))),
                    f = g)),
                    d.doNotShowAllErrosOnSubmit)
                        return !1;
                    if (h.push(g.attr("name")),
                    1 == d.showOneMessage && e)
                        return !1
                }
            }),
            c.trigger("jqv.form.result", [e]),
            e) {
                if (d.scroll)
                    if (g = f.offset().top,
                    h = f.offset().left,
                    i = d.promptPosition,
                    "string" == typeof i && -1 != i.indexOf(":") && (i = i.substring(0, i.indexOf(":"))),
                    "bottomRight" != i && "bottomLeft" != i && (j = b._getPrompt(f),
                    j && (g = j.offset().top)),
                    d.scrollOffset && (g -= d.scrollOffset),
                    d.isOverflown) {
                        if (k = a(d.overflownDIV),
                        !k.length)
                            return !1;
                        l = k.scrollTop(),
                        m = -parseInt(k.offset().top),
                        g += l + m - 5,
                        n = a(d.overflownDIV + ":not(:animated)"),
                        n.animate({
                            scrollTop: g
                        }, 1100, function() {
                            d.focusFirstField && f.focus()
                        })
                    } else
                        a("html, body").animate({
                            scrollTop: g
                        }, 1100, function() {
                            d.focusFirstField && f.focus()
                        }),
                        a("html, body").animate({
                            scrollLeft: h
                        }, 1100);
                else
                    d.focusFirstField && f.focus();
                return !1
            }
            return !0
        },
        _validateFormWithAjax: function(c, d) {
            var e = c.serialize()
              , f = d.ajaxFormValidationMethod ? d.ajaxFormValidationMethod : "GET"
              , g = d.ajaxFormValidationURL ? d.ajaxFormValidationURL : c.attr("action")
              , h = d.dataType ? d.dataType : "json";
            a.ajax({
                type: f,
                url: g,
                cache: !1,
                dataType: h,
                data: e,
                form: c,
                methods: b,
                options: d,
                beforeSend: function() {
                    return d.onBeforeAjaxFormValidation(c, d)
                },
                error: function(a, c) {
                    d.onFailure ? d.onFailure(a, c) : b._ajaxError(a, c)
                },
                success: function (e) {

                    d.onAjaxFormComplete(c, e);
                    
                    //var f, g, i, j, k, l, m;
                    //if ("json" == h && e !== !0) {
                    //    for (f = !1,
                    //    g = 0; g < e.length; g++)
                    //        i = e[g],
                    //        j = i[0],
                    //        k = a(a("#" + j)[0]),
                    //        1 == k.length && (l = i[2],
                    //        1 == i[1] ? "" != l && l ? (d.allrules[l] && (m = d.allrules[l].alertTextOk,
                    //        m && (l = m)),
                    //        d.showPrompts && b._showPrompt(k, l, "pass", !1, d, !0)) : b._closePrompt(k) : (f |= !0,
                    //        d.allrules[l] && (m = d.allrules[l].alertText,
                    //        m && (l = m)),
                    //        d.showPrompts && b._showPrompt(k, l, "", !1, d, !0)));
                    //    d.onAjaxFormComplete(!f, c, e, d)
                    //} else
                    //    d.onAjaxFormComplete(!0, c, e, d)
                }
            })
        },
        _validateField: function(c, d, e) {
            var f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z;
            if (c.attr("id") || (c.attr("id", "form-validation-field-" + a.validationEngine.fieldIdCounter),
            ++a.validationEngine.fieldIdCounter),
            !d.validateNonVisibleFields && (c.is(":hidden") && !d.prettySelect || c.parent().is(":hidden")))
                return !1;
            if (f = c.attr(d.validateAttribute),
            g = /validate\[(.*)\]/.exec(f),
            !g)
                return !1;
            for (h = g[1],
            i = h.split(/\[|,|\]/),
            j = !1,
            k = c.attr("name"),
            l = "",
            m = "",
            n = !1,
            o = !1,
            d.isError = !1,
            d.showArrow = !0,
            d.maxErrorsPerField > 0 && (o = !0),
            p = a(c.closest("form, .validationEngineContainer")),
            q = 0; q < i.length; q++)
                i[q] = i[q].replace(" ", ""),
                "" === i[q] && delete i[q];
            for (q = 0,
            r = 0; q < i.length; q++) {
                if (o && r >= d.maxErrorsPerField) {
                    n || (s = a.inArray("required", i),
                    n = -1 != s && s >= q);
                    break
                }
                switch (t = void 0,
                i[q]) {
                case "required":
                    n = !0,
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._required);
                    break;
                case "custom":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._custom);
                    break;
                case "groupRequired":
                    u = "[" + d.validateAttribute + "*=" + i[q + 1] + "]",
                    v = p.find(u).eq(0),
                    v[0] != c[0] && (b._validateField(v, d, e),
                    d.showArrow = !0),
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._groupRequired),
                    t && (n = !0),
                    d.showArrow = !1;
                    break;
                case "ajax":
                    t = b._ajax(c, i, q, d),
                    t && (m = "load");
                    break;
                case "minSize":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._minSize);
                    break;
                case "maxSize":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._maxSize);
                    break;
                case "min":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._min);
                    break;
                case "max":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._max);
                    break;
                case "past":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._past);
                    break;
                case "future":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._future);
                    break;
                case "dateRange":
                    u = "[" + d.validateAttribute + "*=" + i[q + 1] + "]",
                    d.firstOfGroup = p.find(u).eq(0),
                    d.secondOfGroup = p.find(u).eq(1),
                    (d.firstOfGroup[0].value || d.secondOfGroup[0].value) && (t = b._getErrorMessage(p, c, i[q], i, q, d, b._dateRange)),
                    t && (n = !0),
                    d.showArrow = !1;
                    break;
                case "dateTimeRange":
                    u = "[" + d.validateAttribute + "*=" + i[q + 1] + "]",
                    d.firstOfGroup = p.find(u).eq(0),
                    d.secondOfGroup = p.find(u).eq(1),
                    (d.firstOfGroup[0].value || d.secondOfGroup[0].value) && (t = b._getErrorMessage(p, c, i[q], i, q, d, b._dateTimeRange)),
                    t && (n = !0),
                    d.showArrow = !1;
                    break;
                case "maxCheckbox":
                    c = a(p.find("input[name='" + k + "']")),
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._maxCheckbox);
                    break;
                case "minCheckbox":
                    c = a(p.find("input[name='" + k + "']")),
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._minCheckbox);
                    break;
                case "equals":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._equals);
                    break;
                case "funcCall":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._funcCall);
                    break;
                case "creditCard":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._creditCard);
                    break;
                case "condRequired":
                    t = b._getErrorMessage(p, c, i[q], i, q, d, b._condRequired),
                    void 0 !== t && (n = !0)
                }
                if (w = !1,
                "object" == typeof t)
                    switch (t.status) {
                    case "_break":
                        w = !0;
                        break;
                    case "_error":
                        t = t.message;
                        break;
                    case "_error_no_prompt":
                        return !0
                    }
                if (w)
                    break;
                "string" == typeof t && (l += t + "<br/>",
                d.isError = !0,
                r++)
            }
            return !n && !c.val() && c.val().length < 1 && i.indexOf("equals") < 0 && (d.isError = !1),
            x = c.prop("type"),
            y = c.data("promptPosition") || d.promptPosition,
            ("radio" == x || "checkbox" == x) && p.find("input[name='" + k + "']").size() > 1 && (c = "inline" === y ? a(p.find("input[name='" + k + "'][type!=hidden]:last")) : a(p.find("input[name='" + k + "'][type!=hidden]:first")),
            d.showArrow = !1),
            c.is(":hidden") && d.prettySelect && (c = p.find("#" + d.usePrefix + b._jqSelector(c.attr("id")) + d.useSuffix)),
            d.isError && d.showPrompts ? b._showPrompt(c, l, m, !1, d) : j || b._closePrompt(c),
            j || c.trigger("jqv.field.result", [c, d.isError, l]),
            z = a.inArray(c[0], d.InvalidFields),
            -1 == z ? d.isError && d.InvalidFields.push(c[0]) : d.isError || d.InvalidFields.splice(z, 1),
            b._handleStatusCssClasses(c, d),
            d.isError && d.onFieldFailure && d.onFieldFailure(c),
            !d.isError && d.onFieldSuccess && d.onFieldSuccess(c),
            d.isError
        },
        _handleStatusCssClasses: function(a, b) {
            b.addSuccessCssClassToField && a.removeClass(b.addSuccessCssClassToField),
            b.addFailureCssClassToField && a.removeClass(b.addFailureCssClassToField),
            b.addSuccessCssClassToField && !b.isError && a.addClass(b.addSuccessCssClassToField),
            b.addFailureCssClassToField && b.isError && a.addClass(b.addFailureCssClassToField)
        },
        _getErrorMessage: function(c, d, e, f, g, h, i) {
            var k, l, m, n, o, p, j = jQuery.inArray(e, f);
            return ("custom" === e || "funcCall" === e) && (k = f[j + 1],
            e = e + "[" + k + "]",
            delete f[j]),
            l = e,
            m = d.attr("data-validation-engine") ? d.attr("data-validation-engine") : d.attr("class"),
            n = m.split(" "),
            o = "future" == e || "past" == e || "maxCheckbox" == e || "minCheckbox" == e ? i(c, d, f, g, h) : i(d, f, g, h),
            void 0 != o && (p = b._getCustomErrorMessage(a(d), n, l, h),
            p && (o = p)),
            o
        },
        _getCustomErrorMessage: function(a, c, d, e) {
            var h, i, j, f = !1, g = /^custom\[.*\]$/.test(d) ? b._validityProp.custom : b._validityProp[d];
            if (void 0 != g && (f = a.attr("data-errormessage-" + g),
            void 0 != f))
                return f;
            if (f = a.attr("data-errormessage"),
            void 0 != f)
                return f;
            if (h = "#" + a.attr("id"),
            "undefined" != typeof e.custom_error_messages[h] && "undefined" != typeof e.custom_error_messages[h][d])
                f = e.custom_error_messages[h][d].message;
            else if (c.length > 0)
                for (i = 0; i < c.length && c.length > 0; i++)
                    if (j = "." + c[i],
                    "undefined" != typeof e.custom_error_messages[j] && "undefined" != typeof e.custom_error_messages[j][d]) {
                        f = e.custom_error_messages[j][d].message;
                        break
                    }
            return f || "undefined" == typeof e.custom_error_messages[d] || "undefined" == typeof e.custom_error_messages[d].message || (f = e.custom_error_messages[d].message),
            f
        },
        _validityProp: {
            required: "value-missing",
            custom: "custom-error",
            groupRequired: "value-missing",
            ajax: "custom-error",
            minSize: "range-underflow",
            maxSize: "range-overflow",
            min: "range-underflow",
            max: "range-overflow",
            past: "type-mismatch",
            future: "type-mismatch",
            dateRange: "type-mismatch",
            dateTimeRange: "type-mismatch",
            maxCheckbox: "range-overflow",
            minCheckbox: "range-underflow",
            equals: "pattern-mismatch",
            funcCall: "custom-error",
            creditCard: "pattern-mismatch",
            condRequired: "value-missing"
        },
        _required: function(b, c, d, e, f) {
            var g, h, i, j, k;
            switch (b.prop("type")) {
            case "text":
            case "password":
            case "textarea":
            case "file":
            case "select-one":
            case "select-multiple":
            default:
                if (g = a.trim(b.val()),
                h = a.trim(b.attr("data-validation-placeholder")),
                i = a.trim(b.attr("placeholder")),
                !g || h && g == h || i && g == i)
                    return e.allrules[c[d]].alertText;
                break;
            case "radio":
            case "checkbox":
                if (f) {
                    if (!b.attr("checked"))
                        return e.allrules[c[d]].alertTextCheckboxMultiple;
                    break
                }
                if (j = b.closest("form, .validationEngineContainer"),
                k = b.attr("name"),
                0 == j.find("input[name='" + k + "']:checked").size())
                    return 1 == j.find("input[name='" + k + "']:visible").size() ? e.allrules[c[d]].alertTextCheckboxe : e.allrules[c[d]].alertTextCheckboxMultiple
            }
        },
        _groupRequired: function(c, d, e, f) {
            var g = "[" + f.validateAttribute + "*=" + d[e + 1] + "]"
              , h = !1;
            return c.closest("form, .validationEngineContainer").find(g).each(function() {
                return b._required(a(this), d, e, f) ? void 0 : (h = !0,
                !1)
            }),
            h ? void 0 : f.allrules[d[e]].alertText
        },
        _custom: function(a, b, c, d) {
            var g, h, i, e = b[c + 1], f = d.allrules[e];
            if (!f)
                return alert("jqv:custom rule not found - " + e),
                void 0;
            if (f.regex) {
                if (h = f.regex,
                !h)
                    return alert("jqv:custom regex not found - " + e),
                    void 0;
                if (i = new RegExp(h),
                !i.test(a.val()))
                    return d.allrules[e].alertText
            } else {
                if (!f.func)
                    return alert("jqv:custom type not allowed " + e),
                    void 0;
                if (g = f.func,
                "function" != typeof g)
                    return alert("jqv:custom parameter 'function' is no function - " + e),
                    void 0;
                if (!g(a, b, c, d))
                    return d.allrules[e].alertText
            }
        },
        _funcCall: function(a, b, c, d) {
            var f, g, h, e = b[c + 1];
            if (e.indexOf(".") > -1) {
                for (g = e.split("."),
                h = window; g.length; )
                    h = h[g.shift()];
                f = h
            } else
                f = window[e] || d.customFunctions[e];
            return "function" == typeof f ? f(a, b, c, d) : void 0
        },
        _equals: function(b, c, d, e) {
            var f = c[d + 1];
            return b.val() != a("#" + f).val() ? e.allrules.equals.alertText : void 0
        },
        _maxSize: function(a, b, c, d) {
            var g, e = b[c + 1], f = a.val().length;
            return f > e ? (g = d.allrules.maxSize,
            g.alertText + e + g.alertText2) : void 0
        },
        _minSize: function(a, b, c, d) {
            var g, e = b[c + 1], f = a.val().length;
            return e > f ? (g = d.allrules.minSize,
            g.alertText + e + g.alertText2) : void 0
        },
        _min: function(a, b, c, d) {
            var g, e = parseFloat(b[c + 1]), f = parseFloat(a.val());
            return e > f ? (g = d.allrules.min,
            g.alertText2 ? g.alertText + e + g.alertText2 : g.alertText + e) : void 0
        },
        _max: function(a, b, c, d) {
            var g, e = parseFloat(b[c + 1]), f = parseFloat(a.val());
            return f > e ? (g = d.allrules.max,
            g.alertText2 ? g.alertText + e + g.alertText2 : g.alertText + e) : void 0
        },
        _past: function(c, d, e, f, g) {
            var j, k, l, h = e[f + 1], i = a(c.find("*[name='" + h.replace(/^#+/, "") + "']"));
            if ("now" == h.toLowerCase())
                j = new Date;
            else if (void 0 != i.val()) {
                if (i.is(":disabled"))
                    return;
                j = b._parseDate(i.val())
            } else
                j = b._parseDate(h);
            return k = b._parseDate(d.val()),
            k > j ? (l = g.allrules.past,
            l.alertText2 ? l.alertText + b._dateToString(j) + l.alertText2 : l.alertText + b._dateToString(j)) : void 0
        },
        _future: function(c, d, e, f, g) {
            var j, k, l, h = e[f + 1], i = a(c.find("*[name='" + h.replace(/^#+/, "") + "']"));
            if ("now" == h.toLowerCase())
                j = new Date;
            else if (void 0 != i.val()) {
                if (i.is(":disabled"))
                    return;
                j = b._parseDate(i.val())
            } else
                j = b._parseDate(h);
            return k = b._parseDate(d.val()),
            j > k ? (l = g.allrules.future,
            l.alertText2 ? l.alertText + b._dateToString(j) + l.alertText2 : l.alertText + b._dateToString(j)) : void 0
        },
        _isDate: function(a) {
            var b = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(?:(?:0?[1-9]|1[0-2])(\/|-)(?:0?[1-9]|1\d|2[0-8]))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^(0?2(\/|-)29)(\/|-)(?:(?:0[48]00|[13579][26]00|[2468][048]00)|(?:\d\d)?(?:0[48]|[2468][048]|[13579][26]))$/);
            return b.test(a)
        },
        _isDateTime: function(a) {
            var b = new RegExp(/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1}$|^(?:(?:(?:0?[13578]|1[02])(\/|-)31)|(?:(?:0?[1,3-9]|1[0-2])(\/|-)(?:29|30)))(\/|-)(?:[1-9]\d\d\d|\d[1-9]\d\d|\d\d[1-9]\d|\d\d\d[1-9])$|^((1[012]|0?[1-9]){1}\/(0?[1-9]|[12][0-9]|3[01]){1}\/\d{2,4}\s+(1[012]|0?[1-9]){1}:(0?[1-5]|[0-6][0-9]){1}:(0?[0-6]|[0-6][0-9]){1}\s+(am|pm|AM|PM){1})$/);
            return b.test(a)
        },
        _dateCompare: function(a, b) {
            return new Date(a.toString()) < new Date(b.toString())
        },
        _dateRange: function(a, c, d, e) {
            return !e.firstOfGroup[0].value && e.secondOfGroup[0].value || e.firstOfGroup[0].value && !e.secondOfGroup[0].value ? e.allrules[c[d]].alertText + e.allrules[c[d]].alertText2 : b._isDate(e.firstOfGroup[0].value) && b._isDate(e.secondOfGroup[0].value) ? b._dateCompare(e.firstOfGroup[0].value, e.secondOfGroup[0].value) ? void 0 : e.allrules[c[d]].alertText + e.allrules[c[d]].alertText2 : e.allrules[c[d]].alertText + e.allrules[c[d]].alertText2
        },
        _dateTimeRange: function(a, c, d, e) {
            return !e.firstOfGroup[0].value && e.secondOfGroup[0].value || e.firstOfGroup[0].value && !e.secondOfGroup[0].value ? e.allrules[c[d]].alertText + e.allrules[c[d]].alertText2 : b._isDateTime(e.firstOfGroup[0].value) && b._isDateTime(e.secondOfGroup[0].value) ? b._dateCompare(e.firstOfGroup[0].value, e.secondOfGroup[0].value) ? void 0 : e.allrules[c[d]].alertText + e.allrules[c[d]].alertText2 : e.allrules[c[d]].alertText + e.allrules[c[d]].alertText2
        },
        _maxCheckbox: function(a, b, c, d, e) {
            var f = c[d + 1]
              , g = b.attr("name")
              , h = a.find("input[name='" + g + "']:checked").size();
            return h > f ? (e.showArrow = !1,
            e.allrules.maxCheckbox.alertText2 ? e.allrules.maxCheckbox.alertText + " " + f + " " + e.allrules.maxCheckbox.alertText2 : e.allrules.maxCheckbox.alertText) : void 0
        },
        _minCheckbox: function(a, b, c, d, e) {
            var f = c[d + 1]
              , g = b.attr("name")
              , h = a.find("input[name='" + g + "']:checked").size();
            return f > h ? (e.showArrow = !1,
            e.allrules.minCheckbox.alertText + " " + f + " " + e.allrules.minCheckbox.alertText2) : void 0
        },
        _creditCard: function(a, b, c, d) {
            var j, h, i, k, e = !1, f = a.val().replace(/ +/g, "").replace(/-+/g, ""), g = f.length;
            if (g >= 14 && 16 >= g && parseInt(f) > 0) {
                h = 0,
                c = g - 1,
                i = 1,
                k = new String;
                do
                    j = parseInt(f.charAt(c)),
                    k += 0 == i++ % 2 ? 2 * j : j;
                while (--c >= 0);for (c = 0; c < k.length; c++)
                    h += parseInt(k.charAt(c));
                e = 0 == h % 10
            }
            return e ? void 0 : d.allrules.creditCard.alertText
        },
        _ajax: function(c, d, e, f) {
            var l, m, o, p, q, g = d[e + 1], h = f.allrules[g], i = h.extraData, j = h.extraDataDynamic, k = {
                fieldId: c.attr("id"),
                fieldValue: c.val()
            };
            if ("object" == typeof i)
                a.extend(k, i);
            else if ("string" == typeof i)
                for (l = i.split("&"),
                e = 0; e < l.length; e++)
                    m = l[e].split("="),
                    m[0] && m[0] && (k[m[0]] = m[1]);
            if (j)
                for (o = String(j).split(","),
                e = 0; e < o.length; e++)
                    p = o[e],
                    a(p).length && (q = c.closest("form, .validationEngineContainer").find(p).val(),
                    p.replace("#", "") + "=" + escape(q),
                    k[p.replace("#", "")] = q);
            return "field" == f.eventTrigger && delete f.ajaxValidCache[c.attr("id")],
            f.isError || b._checkAjaxFieldStatus(c.attr("id"), f) ? void 0 : (a.ajax({
                type: f.ajaxFormValidationMethod,
                url: h.url,
                cache: !1,
                dataType: "json",
                data: k,
                field: c,
                rule: h,
                methods: b,
                options: f,
                beforeSend: function() {},
                error: function(a, c) {
                    f.onFailure ? f.onFailure(a, c) : b._ajaxError(a, c)
                },
                success: function(d) {
                    var i, j, k, e = d[0], g = a("#" + e).eq(0);
                    1 == g.length && (i = d[1],
                    j = d[2],
                    i ? (f.ajaxValidCache[e] = !0,
                    j ? f.allrules[j] && (k = f.allrules[j].alertTextOk,
                    k && (j = k)) : j = h.alertTextOk,
                    f.showPrompts && (j ? b._showPrompt(g, j, "pass", !0, f) : b._closePrompt(g)),
                    "submit" == f.eventTrigger && c.closest("form").submit()) : (f.ajaxValidCache[e] = !1,
                    f.isError = !0,
                    j ? f.allrules[j] && (k = f.allrules[j].alertText,
                    k && (j = k)) : j = h.alertText,
                    f.showPrompts && b._showPrompt(g, j, "", !0, f))),
                    g.trigger("jqv.field.result", [g, f.isError, j])
                }
            }),
            h.alertTextLoad)
        },
        _ajaxError: function(a, b) {
            0 == a.status && null  == b ? alert("The page is not served from a server! ajax call failed") : "undefined" != typeof console && console.log("Ajax error: " + a.status + " " + b)
        },
        _dateToString: function(a) {
            return a.getFullYear() + "-" + (a.getMonth() + 1) + "-" + a.getDate()
        },
        _parseDate: function(a) {
            var b = a.split("-");
            return b == a && (b = a.split("/")),
            b == a ? (b = a.split("."),
            new Date(b[2],b[1] - 1,b[0])) : new Date(b[0],b[1] - 1,b[2])
        },
        _showPrompt: function(c, d, e, f, g, h) {
            c.data("jqv-prompt-at") instanceof jQuery ? c = c.data("jqv-prompt-at") : c.data("jqv-prompt-at") && (c = a(c.data("jqv-prompt-at")));
            var i = b._getPrompt(c);
            h && (i = !1),
            a.trim(d) && (i ? b._updatePrompt(c, i, d, e, f, g) : b._buildPrompt(c, d, e, f, g))
        },
        _buildPrompt: function(c, d, e, f, g) {
            var j, k, l, m, n, h = a("<div>");
            switch (h.addClass(b._getClassName(c.attr("id")) + "formError"),
            h.addClass("parentForm" + b._getClassName(c.closest("form, .validationEngineContainer").attr("id"))),
            h.addClass("formError"),
            e) {
            case "pass":
                h.addClass("greenPopup");
                break;
            case "load":
                h.addClass("blackPopup")
            }
            if (f && h.addClass("ajaxed"),
            a("<div>").addClass("formErrorContent").html(d).appendTo(h),
            j = c.data("promptPosition") || g.promptPosition,
            g.showArrow)
                switch (k = a("<div>").addClass("formErrorArrow"),
                "string" == typeof j && (l = j.indexOf(":"),
                -1 != l && (j = j.substring(0, l))),
                j) {
                case "bottomLeft":
                case "bottomRight":
                    h.find(".formErrorContent").before(k),
                    k.addClass("formErrorArrowBottom").html('<div class="line1"><!-- --></div><div class="line2"><!-- --></div><div class="line3"><!-- --></div><div class="line4"><!-- --></div><div class="line5"><!-- --></div><div class="line6"><!-- --></div><div class="line7"><!-- --></div><div class="line8"><!-- --></div><div class="line9"><!-- --></div><div class="line10"><!-- --></div>');
                    break;
                case "topLeft":
                case "topRight":
                    k.html('<div class="line10"><!-- --></div><div class="line9"><!-- --></div><div class="line8"><!-- --></div><div class="line7"><!-- --></div><div class="line6"><!-- --></div><div class="line5"><!-- --></div><div class="line4"><!-- --></div><div class="line3"><!-- --></div><div class="line2"><!-- --></div><div class="line1"><!-- --></div>'),
                    h.append(k)
                }
            return g.addPromptClass && h.addClass(g.addPromptClass),
            m = c.attr("data-required-class"),
            void 0 !== m ? h.addClass(m) : g.prettySelect && a("#" + c.attr("id")).next().is("select") && (n = a("#" + c.attr("id").substr(g.usePrefix.length).substring(g.useSuffix.length)).attr("data-required-class"),
            void 0 !== n && h.addClass(n)),
            h.css({
                opacity: 0
            }),
            "inline" === j ? (h.addClass("inline"),
            "undefined" != typeof c.attr("data-prompt-target") && a("#" + c.attr("data-prompt-target")).length > 0 ? h.appendTo(a("#" + c.attr("data-prompt-target"))) : c.after(h)) : c.before(h),
            l = b._calculatePosition(c, h, g),
            h.css({
                position: "inline" === j ? "relative" : "absolute",
                top: l.callerTopPosition,
                left: l.callerleftPosition,
                marginTop: l.marginTopSize,
                opacity: 0
            }).data("callerField", c),
            g.autoHidePrompt && setTimeout(function() {
                h.animate({
                    opacity: 0
                }, function() {
                    h.closest(".formErrorOuter").remove(),
                    h.remove()
                })
            }, g.autoHideDelay),
            h.animate({
                opacity: .87
            })
        },
        _updatePrompt: function(a, c, d, e, f, g, h) {
            var i, j;
            c && ("undefined" != typeof e && ("pass" == e ? c.addClass("greenPopup") : c.removeClass("greenPopup"),
            "load" == e ? c.addClass("blackPopup") : c.removeClass("blackPopup")),
            f ? c.addClass("ajaxed") : c.removeClass("ajaxed"),
            c.find(".formErrorContent").html(d),
            i = b._calculatePosition(a, c, g),
            j = {
                top: i.callerTopPosition,
                left: i.callerleftPosition,
                marginTop: i.marginTopSize
            },
            h ? c.css(j) : c.animate(j))
        },
        _closePrompt: function(a) {
            var c = b._getPrompt(a);
            c && c.fadeTo("fast", 0, function() {
                c.parent(".formErrorOuter").remove(),
                c.remove()
            })
        },
        closePrompt: function(a) {
            return b._closePrompt(a)
        },
        _getPrompt: function(c) {
            var d = a(c).closest("form, .validationEngineContainer").attr("id")
              , e = b._getClassName(c.attr("id")) + "formError"
              , f = a("." + b._escapeExpression(e) + ".parentForm" + b._getClassName(d))[0];
            return f ? a(f) : void 0
        },
        _escapeExpression: function(a) {
            return a.replace(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/g, "\\$1")
        },
        isRTL: function(b) {
            var c = a(document)
              , d = a("body")
              , e = b && b.hasClass("rtl") || b && "rtl" === (b.attr("dir") || "").toLowerCase() || c.hasClass("rtl") || "rtl" === (c.attr("dir") || "").toLowerCase() || d.hasClass("rtl") || "rtl" === (d.attr("dir") || "").toLowerCase();
            return Boolean(e)
        },
        _calculatePosition: function(a, b, c) {
            var d, e, f, k, l, m, n, o, p, g = a.width(), h = a.position().left, i = a.position().top;
            switch (a.height(),
            k = b.height(),
            d = e = 0,
            f = -k,
            l = a.data("promptPosition") || c.promptPosition,
            m = "",
            n = "",
            o = 0,
            p = 0,
            "string" == typeof l && -1 != l.indexOf(":") && (m = l.substring(l.indexOf(":") + 1),
            l = l.substring(0, l.indexOf(":")),
            -1 != m.indexOf(",") && (n = m.substring(m.indexOf(",") + 1),
            m = m.substring(0, m.indexOf(",")),
            p = parseInt(n),
            isNaN(p) && (p = 0)),
            o = parseInt(m),
            isNaN(m) && (m = 0)),
            l) {
            default:
            case "topRight":
                e += h + g - 30,
                d += i;
                break;
            case "topLeft":
                d += i,
                e += h;
                break;
            case "centerRight":
                d = i,
                f = 0,
                e = h + a.outerWidth(!0) + 5;
                break;
            case "centerLeft":
                e = h - b.outerWidth(),
                d = i,
                f = 0;
                break;
            case "bottomLeft":
                d = i + a.outerHeight(),
                f = 0,
                e = h;
                break;
            case "bottomRight":
                e = h + g - 30,
                d = i + a.outerHeight(),
                f = 0;
                break;
            case "inline":
                e = 0,
                d = 0,
                f = 0
            }
            return e += o,
            d += p,
            {
                callerTopPosition: d + "px",
                callerleftPosition: e + "px",
                marginTopSize: f + "px"
            }
        },
        _saveOptions: function(b, c) {
            var d, e;
            return a.validationEngineLanguage ? d = a.validationEngineLanguage.allRules : a.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page"),
            a.validationEngine.defaults.allrules = d,
            e = a.extend(!0, {}, a.validationEngine.defaults, c),
            b.data("jqv", e),
            e
        },
        _getClassName: function(a) {
            return a ? a.replace(/:/g, "_").replace(/\./g, "_") : void 0
        },
        _jqSelector: function(a) {
            return a.replace(/([;&,\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, "\\$1")
        },
        _condRequired: function(a, c, d, e) {
            var f, g;
            for (f = d + 1; f < c.length; f++)
                if (g = jQuery("#" + c[f]).first(),
                g.length && void 0 == b._required(g, ["required"], 0, e, !0))
                    return b._required(a, ["required"], 0, e)
        },
        _submitButtonClick: function() {
            var c = a(this)
              , d = c.closest("form, .validationEngineContainer");
            d.data("jqv_submitButton", c.attr("id"))
        }
    };
    a.fn.validationEngine = function(c) {
        var d = a(this);
        return d[0] ? "string" == typeof c && "_" != c.charAt(0) && b[c] ? ("showPrompt" != c && "hide" != c && "hideAll" != c && b.init.apply(d),
        b[c].apply(d, Array.prototype.slice.call(arguments, 1))) : "object" != typeof c && c ? (a.error("Method " + c + " does not exist in jQuery.validationEngine"),
        void 0) : (b.init.apply(d, arguments),
        b.attach.apply(d)) : d
    }
    ,
    a.validationEngine = {
        fieldIdCounter: 0,
        defaults: {
            validationEventTrigger: "blur",
            scroll: !0,
            focusFirstField: !0,
            showPrompts: !0,
            validateNonVisibleFields: !1,
            promptPosition: "topRight",
            bindMethod: "bind",
            inlineAjax: !1,
            ajaxFormValidation: !1,
            ajaxFormValidationURL: !1,
            ajaxFormValidationMethod: "get",
            onAjaxFormComplete: a.noop,
            onBeforeAjaxFormValidation: a.noop,
            onValidationComplete: !1,
            doNotShowAllErrosOnSubmit: !1,
            custom_error_messages: {},
            binded: !0,
            showArrow: !0,
            isError: !1,
            maxErrorsPerField: !1,
            ajaxValidCache: {},
            autoPositionUpdate: !1,
            InvalidFields: [],
            onFieldSuccess: !1,
            onFieldFailure: !1,
            onSuccess: !1,
            onFailure: !1,
            validateAttribute: "class",
            addSuccessCssClassToField: "",
            addFailureCssClassToField: "",
            autoHidePrompt: !1,
            autoHideDelay: 1e4,
            fadeDuration: .3,
            prettySelect: !1,
            addPromptClass: "",
            usePrefix: "",
            useSuffix: "",
            showOneMessage: !1
        }
    },
    a(function() {
        a.validationEngine.defaults.promptPosition = b.isRTL() ? "topLeft" : "topRight"
    })
}(jQuery);
